home *** CD-ROM | disk | FTP | other *** search
/ Aminet 31 / Aminet 31 (1999)(Schatztruhe)[!][Jun 1999].iso / Aminet / dev / basic / outline.lha / OutlineFonts / OutlineFonts.asc < prev    next >
Text File  |  1999-03-15  |  24KB  |  641 lines

  1. ; Description:  Outline font test, doing everything fully, so that the
  2. ;               correct engine for that font can be used to ceate the
  3. ;               characters, rather than just use them as is.
  4. ;
  5. ;                I had to use ASM to call the correct library routines
  6. ;               for non-bullet fonts, as FDConvert only does for one
  7. ;               library, not interchangable ones.
  8. ;
  9. ; Requires:     amigalibs.res with OS3.1 includes (from NewCommandSet1.70)
  10. ;               Probably OS3+, maybe OS2+
  11. ;
  12. ; To do:        Write functions for the following:
  13. ;                   Use of bold, italic, underlined fonts
  14. ;                   Anything else that seems a good idea at the time
  15. ;                   Carrige returns in the print string
  16. ;                   Rather than copy then BltTemplate_, I need to do a fast ASM version
  17. ;
  18. ; Type:         SYSTEM
  19. ;
  20. ; Author:       David McMinn <dmcminn@house-of-mojo.freeserve.co.uk>
  21.  
  22. WBStartup
  23. DEFTYPE.w
  24.  
  25.  
  26.  
  27.  
  28. ; ############################################################################
  29. ; ####################### START OF OUTLINE ROUTINES ##########################
  30. ; ############################################################################
  31. NEWTYPE.GlyphInfo
  32.     *gi_otag.TagItem        ; Pointer to the location of the otag file in memory
  33.     *gi_library.Library     ; Pointer to the library used for this type of font
  34.     *gi_engine.GlyphEngine  ; Pointer to the engine within the library
  35.     gi_xdpi.w               ; X dpi of the target output device
  36.     gi_ydpi.w               ; Y dpi of the target output device
  37.     gi_pointsize.q          ; Current pointsize
  38.     gi_angle.w              ; Current rotation
  39.     gi_spacewidth.l         ; The width of a space in stupid measurement units
  40. End NEWTYPE
  41.  
  42.  
  43. ; ----------------------------------------------------------------------------
  44.  
  45.  
  46. ; -----------------------------------------------------------------------------
  47. ; NAME:
  48. ;       Glyph_CloseEngine
  49. ;
  50. ; SYNOPSIS:
  51. ;       Glyph_CloseEngine{*gi}
  52. ;
  53. ;       Glyph_CloseEngine{.GlyphInfo}
  54. ;
  55. ; FUNCTION:
  56. ;        This function releases all resources that are contained within the
  57. ;       GlyphInfo newtype specified in the pointer passed as a parameter.
  58. ;       Specifically, this closes the glyph engine, the library it came
  59. ;       from and then frees the .otag file from memory.
  60. ;
  61. ; INPUTS:
  62. ;       *gi.GlyphInfo -- a pointer to a GlyphInfo newtype. It is safe to call
  63. ;                        this function with a NULL pointer
  64. ;
  65. ; RESULT:
  66. ;       Resources are freed
  67. ;
  68. ; BUGS:
  69. ;       None
  70. ;
  71. ; SEE ALSO:
  72. ;       Glyph_OpenEngine
  73. ;
  74. ;-----------------------------------------------------------------------------
  75. Statement Glyph_CloseEngine{*gi.GlyphInfo}
  76.     ; If a non-NULL pointer is passed in
  77.     If *gi
  78.         ; Try to free the engine
  79.         If *gi\gi_engine
  80. ;            CloseEngine_ *gi\gi_engine
  81.             MOVEA.l -4(a4),a0               ; Get *gi into a0
  82.             MOVEA.l 4(a0),a6                ; Get proper library base into a6
  83.             MOVEA.l 8(a0),a0                ; Glyph Engine into a0
  84.             JSR     -$24(a6)                ; JSR to CloseEngine_
  85.             *gi\gi_engine = 0
  86.         End If
  87.  
  88.         ; Try to free the library
  89.         If *gi\gi_library
  90.             CloseLibrary_ *gi\gi_library
  91.             *gi\gi_library = 0
  92.         End If
  93.  
  94.         ; Try to free the otag file from memory
  95.         If *gi\gi_otag
  96.             FreeVec_ *gi\gi_otag
  97.             *gi\gi_otag = 0
  98.         End If
  99.     End If
  100. End Statement
  101.  
  102.  
  103. ; ----------------------------------------------------------------------------
  104.  
  105.  
  106. ; -----------------------------------------------------------------------------
  107. ; NAME:
  108. ;       Glyph_OpenEngine
  109. ;
  110. ; SYNOPSIS:
  111. ;       success = Glyph_OpenEngine{*gi, fontname}
  112. ;
  113. ;       long = Glyph_OpenEngine{.GlyphInfo, string}
  114. ;
  115. ; FUNCTION:
  116. ;        This function tries to open all the required resources for rendering
  117. ;       glyphs from the specified font.
  118. ;
  119. ; INPUTS:
  120. ;       *gi.GlyphInfo -- Pointer to a GlyphInfo newtype. This should not be
  121. ;                        initialised before calling this function, if it
  122. ;                        has been used before make sure you free all resources
  123. ;                        by calling Glyph_CloseEngine first.
  124. ;       fontname$ -- The name of the font you wish to open. This is
  125. ;                    specified as the full path to the font and the name of it,
  126. ;                    minus the .otag extension, i.e. "FONTS:CGTimes"
  127. ;
  128. ; RESULT:
  129. ;        On success this function returns TRUE. On failure, it will
  130. ;       return FALSE.
  131. ;
  132. ; BUGS:
  133. ;       None
  134. ;
  135. ; SEE ALSO:
  136. ;       Glyph_CloseEngine
  137. ;
  138. ;-----------------------------------------------------------------------------
  139. Function.l Glyph_OpenEngine{*gi.GlyphInfo,fontname$}
  140.     DEFTYPE.b           *enptr      ; Pointer to the start of the engine name string
  141.     DEFTYPE.l           *ge         ; The glyph engine for this font
  142.     DEFTYPE.s           sename      ; The name of the scaling engine
  143.     DEFTYPE.s           selib       ; The name of the library for this engine
  144.     DEFTYPE.s           otpath      ; The full path and name of the font + .otag
  145.     DEFTYPE.w           ge_ok       ; Flag to show if the glyph engine was set up OK
  146.  
  147.     DEFTYPE.TagItem     *otag       ; Pointer to the otag data in memory
  148.     DEFTYPE.l           otagsize    ; Size of the .otag file for this font
  149.     DEFTYPE.w           dfh_id      ; The ID field from the diskfontcontents structure (.font file)
  150.     DEFTYPE.TagItem     *ptr        ; Working pointer, for use with the OTAG taglist
  151.  
  152.     Dim tag.TagItem(3)              ; The taglist used to set options in the glyph engine
  153.  
  154.     ; Initialise pointer to .otag file in memory
  155.     *gi\gi_otag = 0
  156.  
  157.     ; Try to read the font contents file (.font file) from FONTS:
  158.     If ReadFile(0,fontname$+".font")
  159.         FileInput 0
  160.         ; If we could open it, read the first two bytes into a word, for recognition
  161.         ReadMem 0,&dfh_id,2
  162.         PopInput
  163.         CloseFile 0
  164.     End If
  165.  
  166.     ; Check if the font is an outline font
  167.     If dfh_id=#OFCH_ID
  168.         ; If it is then we read the contents of the .otag file (Outline TAG file)
  169.         If ReadFile(0,fontname$+".otag")
  170.             FileInput 0
  171.             otagsize.l = Lof(0)
  172.             *gi\gi_otag = AllocVec_(otagsize, #MEMF_CLEAR|#MEMF_PUBLIC)
  173.             If(*gi\gi_otag) Then ReadMem 0,*gi\gi_otag,otagsize
  174.             PopInput
  175.             CloseFile 0
  176.         End If
  177.     End If
  178.  
  179.     ; If the otag file was read into memory, this pointer will be valid
  180.     ; and we can process it that little bit extra (sort out OT_Indirects
  181.     ; (which are ti_Datas that are supposed to be pointers, but are specified
  182.     ; as offsets.
  183.     If *gi\gi_otag
  184.         If *gi\gi_otag\ti_Tag<>#OT_FileIdent OR *gi\gi_otag\ti_Data<>otagsize
  185.             ; This must be the first tag and data, it is to verify that the otag file is valid
  186.             Glyph_CloseEngine{*gi}
  187.         Else
  188.             ; Now we have the .otag file and it is valid, we can begin processing it
  189.             ; Start from the second tag (as we know that #OT_FileIdent is the
  190.             ; first tag)
  191.             *ptr = *gi\gi_otag + SizeOf.TagItem
  192.             While *ptr\ti_Tag
  193.                 ; For all the tags check if the indirect flag is set, and if it is
  194.                 ; add the base address of the data block to the tag data.
  195.                 ; That is because the tag data specifies an offset not an address.
  196.                 If *ptr\ti_Tag & #OT_Indirect Then *ptr\ti_Data=*ptr\ti_Data+*gi\gi_otag
  197.                 *ptr = *ptr + SizeOf.TagItem
  198.             Wend
  199.         End If
  200.     End If
  201.  
  202.  
  203.     ;  Return a failure if we do not have a valid outline taglist
  204.     If *gi\gi_otag=0 Then Function Return 0
  205.  
  206.  
  207.     ; Try to get pointer to the engine name string, from the taglist
  208.     *enptr = GetTagData_(#OT_Engine, 0, *gi\gi_otag)
  209.     If *enptr=0
  210.         ; If we couldn't find the name string then we need to return a
  211.         ; failure
  212.         Glyph_CloseEngine{*gi}
  213.         Function Return 0
  214.     End If
  215.  
  216.  
  217.     ; Try to get the width of a space character in ridiculous units
  218.     *gi\gi_spacewidth = GetTagData_(#OT_SpaceWidth, 0, *gi\gi_otag)
  219.  
  220.  
  221.     ; Get the name